运行gdb
想要调试程序,在编译程序的时候需要添加-g参数.1
2
3g++ test.cpp -g -o test
gdb test #调试程序
gdb test -tui #显示代码窗口
另一种方式:1
2gdb #启动gdb
file test #用file命令来启动对test的调试
- gdb调试没有链接源码
1
gdb> set directories pathname
设置参数
1 | 方法1: |
断点管理
1 | b <行号> #添加断点,b:breakpoint的简写 |
运行程序
1 | r #run的简写 |
控制调试进程
1 | n #单步执行,不跳入函数,next的简写(vs中F10) |
打印\监视变量
1 | display 变量1 #推荐这种,每步都会输出要查看的变量 |
nb功能
1 | set (i=0) #设置i=0 |
快照管理
调试到某个地方时:1
2
3
4ch #添加当前状态的快照,checkpoint的简写(nb啊)
i ch #查看快照信息
restart 1 #运行1号快照
d c <ID> #删除编号为ID的快照
窗口设置
1 | layout src #显示源码窗口 |
调试coredump
core文件相关设置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#查看资源相关限制信息
ulimit -a
#设置core文件大小为无限大,设置0则不会产生core文件
ulimit -c unlimited
#查看core文件存储位置
cat /proc/sys/kernel/core_pattern
#修改core文件位置
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
/data/coredump是自己指定的存放coredump文件的路径
%e表示程序的文件名
%E:程序文件的完整路径
%p表示进程的ID
%t:进程奔溃的时间戳
%s:哪个信号让进程奔溃
#永久设置core文件大小和存储位置
vim /etc/profile
ulimit -c unlimited
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
gdb调试core文件1
2
3
4
5
6
7
8
9
10
11#启动gdb调试core
gdb test core.xxx.xxx
#查看堆栈
bt 或 where
#跳转到1号栈帧
f 1
#打开该帧函数的反汇编代码
disassemble
调试多线程
几个常用命令1
2
3
4
5
6
7
8
9
10
11#打印线程信息
info threads
#查看所有线程的堆栈信息
thread apply all bt
#查看指定线程的堆栈信息
thread apply 5 bt
#进入指定线程栈空间
thread 5
1 |
1 |
其他
PS:只要没有歧义,大部分命令都可以只输入第一个字母.1
2
3
4
5
6q #退出gdb
bt #查看堆栈,backtrace简写
info locals #显示当前函数中的所有变量值
cgdb test #一个可视化调试工具.
(gdb) wi #可视化调试
(gdb) whatis a #查看变量类型
- 调试时重定向 run < test.txt
问题记录
1.No frame is currently executing in specified block Command aborted.
问题原因:使用watch监视变量tmp,但是程序运行到tmp未定义的地方了.
解决方法:info watch查看变量tmp的编号,delete <编号> 就可以了.
参考
https://www.xuebuyuan.com/1855384.html
https://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html
https://www.cnblogs.com/rosesmall/archive/2012/04/13/2445527.html
https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
https://www.jianshu.com/p/08de5cef2de9
欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/